#include<iostream>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0

#define MAXSIZE 10

typedef int Status;

typedef struct List
{
	int data = 0;//数据
	int cur;//游标
}StaticLinkList;

//检测链表长度
int Listlength(StaticLinkList *list)
{

	int tcur = list[MAXSIZE - 1].cur;
	int length = 0;
	while (tcur != 0)
	{
		tcur = list[tcur].cur;
		length++;
	}
	if (length >= MAXSIZE - 2)
	{
		std::cout << "链表已满\n";
		system("pause");
	}
	return length;
}

//初始化
Status Initlist(StaticLinkList *list)
{
	int i;
	for (i = 0; i < MAXSIZE; i++)
	{
		list[i].cur = i + 1;//每一个元素的游标，都记录着下一个元素的下标
	}
	list[MAXSIZE - 1].cur = 0;
	return OK;
}

//插入
int Malloc_SLL(StaticLinkList *list)//返回第一个空闲分量的下标，同时把下一个空闲分量留作备用
{
	int i = list[0].cur;//将第一个空闲分量（代插入位置）的下标，用i存下来
	if (list[i].cur != 0)//如果不是空链表
	{
		list[0].cur = list[i].cur;//把下一个空闲分量留作备用
	}
	return i;//返回第一个空闲分量的下标
}

Status ListInsert(StaticLinkList *L, int i, int e)//在i位置插入元素e
{
	int j;//第一个空闲分量的下标
	int k;
	int l;
	k = MAXSIZE - 1;//数组最后一个元素的下标
	if (i<1 || i>Listlength(L) + 1)
	{
		std::cout << "位置超出范围\n";
		return ERROR;
	}
	j = Malloc_SLL(L);//第一个空闲分量的下标，也就是新节点的下标

	if (j != 0)//如果备用链表不为空
	{
		L[j].data = e;//把数据放进备用位置
		for (l = 1; l < i; l++)//根据想要插入的位置i，找到被插入节点的下标j
		{
			k = L[k].cur;
		}
		L[j].cur = L[k].cur;//L[j].cur是新节点游标，另其指向被插入的节点游标L[k].cur
		L[k].cur = j;//L[k].cur是被插入的节点的游标指向，另其指向新节点下标j
		return OK;
	}
	return ERROR;
}

//删除
//将下标为k的空闲节点回收到备用链表
void Free_SLL(StaticLinkList *L, int k)
{
	L[k].cur = L[0].cur;//让k节点的游标指向第一个备用链表节点
	L[0].cur = k;//让数组第一个元素的游标指向k节点
}

Status ListDelete(StaticLinkList *L, int i)
{
	int j;
	int k;
	if (i<1 || i>Listlength(L))
	{
		std::cout << "位置超出范围\n";
		return ERROR;
	}
	k = MAXSIZE - 1;
	for (j = 1; j < i; j++)
	{
		k = L[k].cur;
	}
	j = L[k].cur;
	L[k].cur = L[j].cur;
	Free_SLL(L, j);
	return OK;
}

//打印
void print(StaticLinkList *L)
{
	int tcur = L[MAXSIZE - 1].cur;
	while (tcur != 0)
	{
		std::cout << L[tcur].data << " ";
		tcur = L[tcur].cur;
	}
	std::cout << std::endl;
}

int main()
{
	Status checker;
	StaticLinkList staticLinkList[MAXSIZE];
	checker = Initlist(staticLinkList);

	int i;//想插入的位置
	int e;//想插入的数据
	for (checker = TRUE; checker != ERROR;)
	{
		print(staticLinkList);
		std::cout << "\n(最大长度" << MAXSIZE - 2 << ") 插入:位置 数据 ";
		std::cin >> i >> e;
		checker = ListInsert(staticLinkList, i, e);
	}

	//删除
	for (checker = TRUE; checker != ERROR;)
	{
		print(staticLinkList);
		std::cout << "删除:位置 ";
		std::cin >> i;
		checker = ListDelete(staticLinkList, i);
	}
	system("pause");
}
